how spring boot auto configuration works internally